package org.springblade.modules.admin.service.feishu.impl;

import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.enums.FeiShuDocumentEnum;
import org.springblade.common.utils.feishu.FeiShuUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.admin.dto.PartsWorkSaveDTO;
import org.springblade.modules.admin.dto.UpdateBitableDataDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuBatchDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuCreateBatchDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuFieldsDTO;
import org.springblade.modules.admin.dto.feishu.FeiShuUpdateFieldsDTO;
import org.springblade.modules.admin.entity.Elevator;
import org.springblade.modules.admin.entity.ElevatorDetail;
import org.springblade.modules.admin.service.BuildingService;
import org.springblade.modules.admin.service.ElevatorService;
import org.springblade.modules.admin.service.IElevatorDetailService;
import org.springblade.modules.admin.service.feishu.IFeiShuDocumentService;
import org.springblade.modules.admin.service.feishu.IFeiShuPartsService;
import org.springblade.modules.admin.vo.PartPlanElevatorNumVO;
import org.springblade.modules.system.entity.User;
import org.springblade.modules.system.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.*;

/**
 * @author: Sharry
 * @createTime: 2024-02-02 11:45
 * @version: Version-1.0
 */
@Service
@Slf4j
public class FeiShuPartsServiceImpl implements IFeiShuPartsService {

	@Autowired
	private IFeiShuDocumentService feiShuDocumentService;

	@Autowired
	private ElevatorService elevatorService;

	@Autowired
	private BuildingService buildingService;

	@Autowired
	private IElevatorDetailService elevatorDetailService;

	@Autowired
	private IUserService userService;

	@Autowired
	private FeiShuUtil feiShuUtil;

	/**
	 * 2024-12-20 废弃
	 * 新增部件同步至少维的飞书（副本）
	 * @param dto 部件信息
	 * @return String
	 */
	@Deprecated
	@Override
	public void addPartsMessage(PartsWorkSaveDTO dto) {
		// 1. 数据准备：目标文件夹Token、文档ID; 需要更新的数据列表
		// 获取当前系统启动的是哪个环境
//		String activeProfile = System.getProperty("spring.profiles.active");
//		// 1.1 目标文件夹Token、文档ID
//		String appToken;
//		String tableId;
//		if ("prod".equals(activeProfile)) {
//			appToken = FeiShuDocumentEnum.PART_APPLY_RECORD.getAppToken();
//			tableId = FeiShuDocumentEnum.PART_APPLY_RECORD.getTableId();
//		} else {
//			tableId = FeiShuDocumentEnum.PART_APPLY_RECORD_COPY2.getTableId();
//			appToken = FeiShuDocumentEnum.PART_APPLY_RECORD_COPY2.getAppToken();
//		}
//		// 1.2 上传素材，获取素材 fileTokens
//		List<String> fileUrls = new ArrayList<>();
//		List<String> fileTokens = new ArrayList<>();
//		List<HashMap<String, String>> otherUrl = dto.getOtherUrl();
//
//		// 该格式存到库里是上述格式，获取其中的 url
//		otherUrl.forEach(o -> {
//				if (o.get("type").equals("image")) {
//					fileUrls.add(o.get("url"));
//				}
//			}
//		);
//
//		List<List<String>> splitFileUrls = ListUtil.partition(fileUrls, 5);
//		int urlSize = splitFileUrls.size();
//		for (List<String> splitFileUrl : splitFileUrls) {
//			// 遍历获取的 fileUrls，上传素材
//			splitFileUrl.forEach(f -> {
//				// 步骤 1: 下载文件到本地
//				File downloadedFile = null;
//				try {
//					downloadedFile = downloadFile(f);
//				} catch (IOException e) {
//					log.warn("飞书同步配件信息-下载文件错误,参数:[{}], 错误信息:[{}]", dto, e.getMessage());
//				}
//				// 步骤 2: 获取文件大小
//				long fileSize = downloadedFile.length();
//
//				// 步骤 3: 读取文件内容
////					byte[] fileContent = new byte[0];
////					try {
////						fileContent = Files.readAllBytes(downloadedFile.toPath());
////					} catch (IOException e) {
////						log.warn("飞书同步配件信息-读取文件错误,参数:[{}], 错误信息:[{}]", dto, e.getMessage());
////					}
//
//				// 步骤4: 封装请求体，并调用第三方API
//				JSONObject bodyJson = new JSONObject();
//				bodyJson.put("file_name", downloadedFile.getName());
//				bodyJson.put("parent_type", "bitable_image");
//				bodyJson.put("parent_node", appToken);
//				bodyJson.put("size", String.valueOf(fileSize));
//
//				String fileToken = feiShuDocumentService.commandUploadDoc(appToken, bodyJson.toJSONString(), downloadedFile);
//				fileTokens.add(fileToken);
//				// 步骤 5: 删除本地文件
//				try {
//					deleteLocalFile(downloadedFile.toPath());
//				} catch (IOException e) {
//					log.warn("飞书同步配件信息-删除本地文件错误,参数:[{}], 错误信息:[{}]", dto, e.getMessage());
//				}
//			});
//
//			if (--urlSize > 0) {
//				// 规避飞书上传素材接口调用频率上限为 5 QPS
//				try {
//					Thread.sleep(1000);
//				} catch (InterruptedException e) {
//					throw new RuntimeException(e);
//				}
//			}
//		}
//
//		// 2. 数据处理；数据封装
//		FeiShuCreateBatchDTO feiShuCreateBatchDTO = new FeiShuCreateBatchDTO();
//		List<FeiShuFieldsDTO> records = new ArrayList<>();
//		FeiShuFieldsDTO element = new FeiShuFieldsDTO();
//		Map<String, Object> elementMap = new HashMap<>(10);
//		// 2.1 数据处理:获取各字段数据
//		String buildingName = "";
//		String elevatorNo = "";
//		String supplierName = "";
//		String elevatorNum = "";
//		Integer elevatorStatus = -1;
//		String partName = dto.getPartsName();
//		// partsName 根据 && 分割，取最后一个
//		if (!Func.isNull(partName)) {
//			String[] split = partName.split("&");
//			partName = split[split.length - 1];
//			// 再对 partName 进行处理，去掉开头amp;字符
//			if (partName.startsWith("amp;")) {
//				partName = partName.substring(4);
//			}
//		}
//		Long elevatorId = dto.getElevatorId();
//		if (!Func.isNull(elevatorId)) {
//			Elevator byId = elevatorService.getById(elevatorId);
//			Integer isStop = byId.getIsStop();
//			if (!Func.isNull(isStop)) {
//				elevatorStatus = isStop;
//			}
//			ElevatorDetail detail = elevatorDetailService.getOne(new LambdaQueryWrapper<ElevatorDetail>()
//				.eq(ElevatorDetail::getElevatorId, elevatorId)
//				.eq(ElevatorDetail::getIsDeleted, 0)
//			);
//			if (!Func.isNull(detail)) {
//				elevatorNo = detail.getElevatorAddress();
//				elevatorNum = detail.getElevatorNum();
//			}
//			if (!Func.isNull(byId)) {
//				Long buildingId = byId.getBuildingId();
//				if (!Func.isNull(buildingId)) {
//					buildingName = buildingService.getById(buildingId).getName();
//				}
//			}
//		}
//		List<Map<String, String>> fileTokensMap = new ArrayList<>();
//		fileTokens.forEach(f -> {
//			Map<String, String> map = new HashMap<>();
//			map.put("file_token", f);
//			fileTokensMap.add(map);
//		});
//		Long currentId = AuthUtil.getUserId();
//		User currentUser = userService.getById(currentId);
//		if (!Func.isNull(currentUser)) {
//			supplierName = currentUser.getRealName();
//		} else {
//			supplierName = "admin/管理员";
//		}
//		// 2.2 数据封装
//		Long planId = dto.getPartAddress().getPlanId();
//		elementMap.put("配件申请编号",
//			Func.isNull(planId) ? "" : String.valueOf(planId));
//		elementMap.put("梯无忧项目名称", buildingName);
//		elementMap.put("电梯梯号", elevatorNo);
//		elementMap.put("梯无忧配件名称", partName);
//		elementMap.put("梯无忧配件型号", dto.getPartsModel());
//		elementMap.put("数量", dto.getNum());
//		elementMap.put("需求附件", fileTokensMap);
//		elementMap.put("申请人", supplierName);
//		elementMap.put("需求备注", dto.getDesc());
//		elementMap.put("收货人", dto.getPartAddress().getUserName());
//		elementMap.put("收货人电话", dto.getPartAddress().getPhone());
//		elementMap.put("收货地址", dto.getPartAddress().getProvinceName() + dto.getPartAddress().getCityName() + dto.getPartAddress().getAdName() + dto.getPartAddress().getAddress());
//		// 当前时间毫秒值
//		Long currentTimeMillis = System.currentTimeMillis();
//		elementMap.put("申请时间", currentTimeMillis);
//		elementMap.put("电梯状态",
//			new Integer("1").equals(elevatorStatus) ? "正常" : "停用");
//		elementMap.put("电梯快速识别代码", elevatorNum);
//		elementMap.put("维修任务类型", dto.getPlanTypeDesc());
//		elementMap.put("维修任务编号", String.valueOf(dto.getWxPlanId()));
//		elementMap.put("结果", dto.getResult());
//		element.setFields(elementMap);
//		records.add(element);
//		// 3. 新增数据
//		feiShuCreateBatchDTO.setRecords(records);
//		String result = feiShuDocumentService.commandCompareAddBatch(appToken, tableId, feiShuCreateBatchDTO,"配件申请编号");
//		log.info("添加配件到飞书, 请求体:{}, 结果：{}", dto, result);
//
//		// 4. 发送消息, 通知到群
//		List<JSONObject> targetGroupObjects = feiShuDocumentService.commandQueryGroupsBatch();
//		List<String> chatIds = new ArrayList<>();
//		targetGroupObjects.forEach(t -> chatIds.add(t.getString("chat_id")));
//		// 发送消息
//		chatIds.forEach(c -> {
//			// 组装数据
//			JSONObject bodyJson = new JSONObject();
//			bodyJson.put("receive_id", c);
//			bodyJson.put("msg_type", "text");
//			HashMap<String, String> contentMap = new HashMap<>(2);
//			String message = "新增配件申请信息到" + FeiShuDocumentEnum.getDescription(appToken, tableId) + "结果：" + result + "参数：" + dto;
//			contentMap.put("text", message);
//			// 将 contentMap 转换成 JSON 格式
//			bodyJson.put("content", JSON.toJSONString(contentMap));
//			feiShuDocumentService.commandSendGroupMessage(bodyJson.toJSONString());
//		});
	}

	/**
	 * 根据 planId 更新电梯唯一识别码至少维的飞书（副本）
	 */
	@Override
	public void updatePartsMessageByPlanIdCopy() {
		// 0. 数据准备：目标文件夹Token、文档ID、更新结果信息定义、更新字段类
		String appToken = FeiShuDocumentEnum.PART_APPLY_RECORD_COPY.getAppToken();
		String tableId = FeiShuDocumentEnum.PART_APPLY_RECORD_COPY.getTableId();
		String resultMessage = "";
		List<FeiShuFieldsDTO> records = new ArrayList<>();
		List<FeiShuUpdateFieldsDTO> needUpdate = new ArrayList<>();
		FeiShuBatchDTO tempFeiShuBatchDTO = new FeiShuBatchDTO();
		// 1. 查询数据：梯无忧配件工单-识别码，查询现有记录
		// 1.1 梯无忧配件工单-识别码
		List<PartPlanElevatorNumVO> galaxyPartsPlanElevatorNum = elevatorService.getGalaxyPartsPlanElevatorNum();
		// 2. 获取当前飞书表格已有列表，取交集
		List<JSONObject> tableObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
		galaxyPartsPlanElevatorNum.forEach(u -> {
			Map<String, Object> elementMap = new HashMap<>(10);
			FeiShuFieldsDTO element = new FeiShuFieldsDTO();
			elementMap.put("配件申请编号", u.getPlanId());
			elementMap.put("电梯快速识别代码", u.getElevatorNum());
			element.setFields(elementMap);
			records.add(element);
		});
		Map<String, String> recordMap = new HashMap<>();
		for (JSONObject tableObject : tableObjects) {
			// 将 tableObjects 的内容封装成 一个 Map， key为配件申请编号，value 为 record_id
			Object fields = tableObject.get("fields");
			// fields 转成 JsonObject 格式
			JSONObject tableJsonObject = JSON.parseObject(fields.toString());
			String tablePartSupplyNum = tableJsonObject.getString("配件申请编号");
			if (!Func.isNull(tablePartSupplyNum) && StringUtil.isNotBlank(tablePartSupplyNum)) {
				recordMap.put(tablePartSupplyNum, tableObject.getString("record_id"));
			}
		}
		for (FeiShuFieldsDTO record : records) {
			Object partNum = record.getFields().get("配件申请编号");
			if (Func.isNull(partNum)) {
				continue;
			}
			String partNumStr = partNum.toString();
			if (recordMap.containsKey(partNumStr)) {
				FeiShuUpdateFieldsDTO updateFieldsDTO = new FeiShuUpdateFieldsDTO();
				updateFieldsDTO.setFields(record.getFields());
				updateFieldsDTO.setRecord_id(recordMap.get(partNumStr));
				needUpdate.add(updateFieldsDTO);
			}
		}
		tempFeiShuBatchDTO.setRecords(needUpdate);
		resultMessage = feiShuDocumentService.commandUpdateBatchLimit(appToken,tableId,tempFeiShuBatchDTO);
		// 3. 发送消息
		resultMessage = "根据planId更新" + FeiShuDocumentEnum.getDescription(appToken, tableId) + "结果：" + resultMessage;
		resultMessage += "飞书list接口版本：v1";
		feiShuDocumentService.commandSendGroupMessage(appToken, tableId, resultMessage);

	}

	/**
	 * 根据 planId 更新电梯唯一识别码至少维的飞书（正本）
	 */
	@Override
	public void updatePartsMessageByPlanIdOriginal() {
		// 0. 数据准备：目标文件夹Token、文档ID、更新结果信息定义、更新字段类
		String appToken = FeiShuDocumentEnum.PART_APPLY_RECORD.getAppToken();
		String tableId = FeiShuDocumentEnum.PART_APPLY_RECORD.getTableId();
		String resultMessage = "";
		List<FeiShuFieldsDTO> records = new ArrayList<>();
		List<FeiShuUpdateFieldsDTO> needUpdate = new ArrayList<>();
		FeiShuBatchDTO tempFeiShuBatchDTO = new FeiShuBatchDTO();
		// 1. 查询数据：梯无忧配件工单-识别码，查询现有记录
		// 1.1 梯无忧配件工单-识别码
		List<PartPlanElevatorNumVO> galaxyPartsPlanElevatorNum = elevatorService.getGalaxyPartsPlanElevatorNum();
		// 2. 获取当前飞书表格已有列表，取交集
		List<JSONObject> tableObjects = feiShuDocumentService.commandQueryBatch(appToken, tableId, null);
		galaxyPartsPlanElevatorNum.forEach(u -> {
			Map<String, Object> elementMap = new HashMap<>(10);
			FeiShuFieldsDTO element = new FeiShuFieldsDTO();
			elementMap.put("配件申请编号", u.getPlanId());
			elementMap.put("电梯快速识别代码", u.getElevatorNum());
			element.setFields(elementMap);
			records.add(element);
		});
		Map<String, String> recordMap = new HashMap<>();
		for (JSONObject tableObject : tableObjects) {
			// 将 tableObjects 的内容封装成 一个 Map， key为配件申请编号，value 为 record_id
			Object fields = tableObject.get("fields");
			// fields 转成 JsonObject 格式
			JSONObject tableJsonObject = JSON.parseObject(fields.toString());
			String tablePartSupplyNum = tableJsonObject.getString("配件申请编号");
			if (!Func.isNull(tablePartSupplyNum) && StringUtil.isNotBlank(tablePartSupplyNum)) {
				recordMap.put(tablePartSupplyNum, tableObject.getString("record_id"));
			}
		}
		for (FeiShuFieldsDTO record : records) {
			Object partNum = record.getFields().get("配件申请编号");
			if (Func.isNull(partNum)) {
				continue;
			}
			String partNumStr = partNum.toString();
			if (recordMap.containsKey(partNumStr)) {
				FeiShuUpdateFieldsDTO updateFieldsDTO = new FeiShuUpdateFieldsDTO();
				updateFieldsDTO.setFields(record.getFields());
				updateFieldsDTO.setRecord_id(recordMap.get(partNumStr));
				needUpdate.add(updateFieldsDTO);
			}
		}
		tempFeiShuBatchDTO.setRecords(needUpdate);
		resultMessage = feiShuDocumentService.commandUpdateBatchLimit(appToken,tableId,tempFeiShuBatchDTO);
		// 3. 发送消息
		resultMessage = "根据planId更新" + FeiShuDocumentEnum.getDescription(appToken, tableId) + "结果：" + resultMessage;
		resultMessage += "飞书list接口版本：v1";
		feiShuDocumentService.commandSendGroupMessage(appToken, tableId, resultMessage);
	}


	/**
	 * 异步下载文件
	 *
	 * @param fileUrl 文件URL
	 * @return File
	 */
	public File downloadFile(String fileUrl) throws IOException {
		// 构建URL对象
		URL url = new URL(fileUrl);

		// 打开连接
		try (InputStream in = url.openStream()) {
			// 获取项目根目录
			String projectPath = System.getProperty("user.dir");

			// 获取文件名
			String fileName = fileUrl.substring(fileUrl.lastIndexOf('/') + 1);

			// 连接文件路径和文件名
			Path localFilePath = Paths.get(projectPath, fileName);

			// 下载文件到本地
			Files.copy(in, localFilePath, StandardCopyOption.REPLACE_EXISTING);

			return localFilePath.toFile();
		}
	}

	public void deleteLocalFile(Path filePath) throws IOException {
		// 删除本地文件
		Files.delete(filePath);
		log.info("Local file deleted.");
	}

	@Override
	public void updateBitableByPlanId(UpdateBitableDataDTO dto) {
		try {
			String recordId = feiShuUtil.getRecordIdByPlanId(dto.getAppToken(),dto.getTableId(), dto.getPlanIdField(), dto.getPlanId());
			if (Func.isBlank(recordId)) {
               throw new ServiceException("更新飞书多维表格失败：未找到对应表格数据");
            }
			boolean res = feiShuUtil.updateTableByRecordId(dto.getAppToken(), dto.getTableId(), recordId, dto.getValue());
			if (!res) {
				throw new ServiceException("更新飞书多维表格失败, recordId: " + recordId + ",planId: " + dto.getPlanId());
			}
		} catch (Exception e) {
			throw new ServiceException("更新飞书多维表格失败, planId: " + dto.getPlanId() + ",异常信息：" + e);
		}
	}
}
